import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * 一、Lambda表达式的基础语法：Java8中引入了一个新的操作符->，该操作符简称为箭头操作符或Lambda操作符
 *      箭头操作符将Lambda表达式拆分成两部分：
 *
 * 左侧：Lambda表达式的参数列表
 * 右侧：Lambda表达式中所需要执行的功能，即Lambda体
 *
 * 语法格式一：无参数，无返回值
 * 语法格式二：有一个参数，无返回值
 *   (x) -> System.out.println("hello Lambda")
 * 语法格式三：有一个参数，无返回值
 *   x -> System.out.println("hello Lambda")
 * 语法格式四：有两个以上的参数，有返回值，并且Lambda体中有多条语句
 *            Comparator<Integer> com = (x,y) -> {
 *             System.out.println("函数式接口");
 *             return Integer.compare(x,y);
 *         };
 * 语法格式五：若Lambda体中只有一条语句，return和大括号都可以省略不写
 *      Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
 *
 * 语法格式六：Lambda表达式的参数列表的数据类型可以省略不写，因为JVM编译器通过上下文推断出数据类型，即“类型推断”
 *      Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
 *
 * 左右遇一括号省
 *
 * 二、Lambda表达式需要函数式接口的支持，可以使用@FunctionalInterface修饰，可以检查是否是函数式接口
 */
public class TestLambda2 {
    @Test
    public void test1() {
        int num = 0;  // jdk1.7以前必须为final,现在可以不加final，实际还是有final
//        num++;
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world" + num);    // 不能++
            }
        };
        System.out.println("-------------------------");

        Runnable r1 = () -> System.out.println("hello Lambda");
        r1.run();
    }

    @Test
    public void test2() {
        Consumer<String> con = (x) -> System.out.println(x);
        con.accept("---consumer--");
    }

    @Test
    public void test3() {
        Comparator<Integer> com = (x,y) -> {
            System.out.println("函数式接口");
            return Integer.compare(x,y);
        };
    }

    @Test
    public void test4() {
        Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
    }

    @Test
    public void test5() {
        String[] strs = {"aaa", "bbb", "ccc"};
    }

    //需求：对一个数进行运算
    @Test
    public void test6() {
        Integer num = operator(100, x -> x*x);
        System.out.println(num);

        Integer num2 = operator(100, y -> y+200);
        System.out.println(num2);
    }

    public Integer operator(Integer num, MyFun mf) {
        return mf.getValue(num);
    }
}
